home *** CD-ROM | disk | FTP | other *** search
/ Aminet 12 / Aminet 12 (1996)(GTI - Schatztruhe)[!][Jun 1996].iso / Aminet / dev / e / framework.lha / examples / queens.e < prev    next >
Encoding:
Text File  |  1996-01-29  |  1.8 KB  |  79 lines

  1.  
  2. OPT OSVERSION=37
  3.  
  4. OBJECT queen
  5.   myrow:LONG
  6.   mycolumn:LONG
  7.   neighbor:PTR TO queen
  8.   boardsize:LONG
  9. ENDOBJECT
  10.  
  11. PROC build(aQueen,col,size) OF queen
  12.   self.neighbor:=aQueen
  13.   self.mycolumn:=col
  14.   self.myrow:=1
  15.   self.boardsize:=size
  16.   IF self.neighbor THEN self.neighbor.first()
  17. ENDPROC
  18.  
  19. PROC checkCol(colNumber,rowNumber) OF queen
  20.   DEF cd
  21.   IF rowNumber=self.myrow THEN RETURN FALSE
  22.   cd:=colNumber-self.mycolumn
  23.   IF self.myrow+cd=rowNumber THEN RETURN FALSE
  24.   IF self.myrow-cd=rowNumber THEN RETURN FALSE
  25.   IF self.neighbor THEN RETURN self.neighbor.checkCol(colNumber,rowNumber)
  26. ENDPROC TRUE
  27.  
  28. PROC first() OF queen
  29.   self.myrow:=1
  30. ENDPROC self.checkrow()
  31.  
  32. PROC next() OF queen
  33.   self.myrow:=self.myrow+1
  34. ENDPROC self.checkrow()
  35.  
  36. PROC checkrow() OF queen
  37.   IF self.neighbor=NIL
  38.     IF self.myrow>self.boardsize THEN RETURN 0
  39.     RETURN self.myrow
  40.   ENDIF
  41.   WHILE self.myrow<=self.boardsize
  42.     IF self.neighbor.checkCol(self.mycolumn,self.myrow) THEN
  43.       RETURN self.myrow
  44.     self.myrow:=self.myrow+1
  45.   ENDWHILE
  46.   IF self.neighbor.next()=0 THEN RETURN 0
  47. ENDPROC self.first()
  48.  
  49. PROC printboard() OF queen
  50.   DEF x
  51.   IF self.neighbor THEN self.neighbor.printboard()
  52.   FOR x:=1 TO self.boardsize
  53.     FputC(stdout,IF x=self.myrow THEN "Q" ELSE ".")
  54.   ENDFOR
  55.   FputC(stdout,"\n")
  56. ENDPROC
  57.  
  58. PROC main() HANDLE
  59.   DEF myargs:PTR TO LONG,rdargs
  60.   DEF lastq=NIL:PTR TO queen,newq:PTR TO queen
  61.   DEF size,x
  62.   myargs:=New(8)
  63.   IF (rdargs:=ReadArgs('BOARDSIZE/N/A,ALL/S',myargs,NIL))=NIL THEN Raise(1)
  64.   IF (size:=Long(myargs[0]))<=0 THEN Raise(1)
  65.   FOR x:=1 TO size DO lastq:=NEW newq.build(lastq,x,size)
  66.   IF lastq.first() THEN lastq.printboard()
  67.   IF myargs[1]=FALSE THEN Raise(0)
  68.   WHILE TRUE
  69.     EXIT CtrlC()
  70.     EXIT lastq.next()=0
  71.     FputC(stdout,"\n")
  72.     lastq.printboard()
  73.   ENDWHILE
  74. EXCEPT DO
  75.   IF rdargs THEN FreeArgs(rdargs)
  76.   IF exception THEN WriteF('Bad Args!\n')
  77. ENDPROC
  78.  
  79.